home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / JAVANMI.ASC < prev    next >
Text File  |  1997-06-20  |  4KB  |  167 lines

  1. _The Java Native Method Interface and Windows_
  2. by Andrew Wilson
  3.  
  4. Listing One
  5. import ProcessEntry32;
  6. import java.util.*;
  7.  
  8. class ToolHelp extends Object
  9. {
  10.     static { System.loadLibrary("tlh"); } 
  11.     // Load the native system library
  12.  
  13.     final private int TH32CS_SNAPPROCESS = 2;
  14.  
  15.     private Vector ProcEntries;
  16.     public ToolHelp()
  17.     {
  18.         ProcEntries = new Vector();
  19.         CreateToolhelp32Snapshot( 
  20.         TH32CS_SNAPPROCESS, 0, ProcEntries);
  21.     }
  22.     public Vector getProcList()
  23.     {
  24.         return ProcEntries;
  25.     }
  26.     // native function declaration
  27.     private native boolean CreateToolhelp32Snapshot( 
  28.         int dwFlags, int th32ProcessID, Vector vector);
  29. }
  30.  
  31. Listing Two
  32. /* DO NOT EDIT THIS FILE - it is machine generated */
  33. #include <jni.h>
  34. /* Header for class ToolHelp */
  35.  
  36. #ifndef _Included_ToolHelp
  37. #define _Included_ToolHelp
  38. #ifdef __cplusplus
  39. extern "C" {
  40. #endif
  41. /*
  42.  * Class:     ToolHelp
  43.  * Method:    CreateToolhelp32Snapshot
  44.  * Signature: (IILjava/util/Vector;)Z
  45.  */
  46. JNIEXPORT jboolean JNICALL Java_ToolHelp_CreateToolhelp32Snapshot
  47.   (JNIEnv *, jobject, jint, jint, jobject);
  48.  
  49. #ifdef __cplusplus
  50. }
  51. #endif
  52. #endif
  53.  
  54.  
  55. Listing Three
  56. JNIEXPORT jboolean JNICALL Java_ToolHelp_CreateToolhelp32Snapshot
  57.   (JNIEnv *env, jobject, jint, jint process, jobject vector)
  58. {
  59.     HANDLE handle =  CreateToolhelp32Snapshot(
  60.         TH32CS_SNAPPROCESS, process);
  61.     BOOL first = TRUE;
  62.     jobject ProcEntry32;
  63.     PROCESSENTRY32 ppe;
  64.     do {
  65.         ppe.dwSize = sizeof( PROCESSENTRY32 );
  66.         if(first)
  67.         {
  68.             first = FALSE;
  69.             if ( !Process32First( handle, &ppe))
  70.                 return FALSE;
  71.         }
  72.         else
  73.         {
  74.             if ( !Process32Next( handle, &ppe))
  75.                 return FALSE;
  76.         }
  77.         ProcEntry32 = CreateProcessEntry32(env, &ppe);
  78.     }
  79.     while(AddObject(env, vector,ProcEntry32 ) );    
  80.     return TRUE;
  81. }
  82.  
  83.  
  84. Listing Four
  85. jobject CreateProcessEntry32( JNIEnv * env, LPPROCESSENTRY32 lppe)
  86. {
  87.     jclass jcProcEntry32 =  env->FindClass("ProcessEntry32");
  88.     if(jcProcEntry32 == NULL)
  89.         return NULL;
  90.     jmethodID jmProcEntry32 = env->GetMethodID(jcProcEntry32,
  91.         "<init>", "()V");
  92.     if(jmProcEntry32 == NULL)
  93.         return NULL;
  94.       jobject joProcEntry32 = env->NewObject(jcProcEntry32,jmProcEntry32,"");
  95.     if(joProcEntry32 == NULL)
  96.         return NULL;
  97.     if (!SetDWORDField(env, lppe->cntUsage, joProcEntry32, "cntUsage"))
  98.         return NULL;
  99.     if (!SetDWORDField(env, lppe->th32ProcessID, joProcEntry32, "th32ProcessID"))
  100.         return NULL;
  101.     if (!SetDWORDField(env, lppe->th32DefaultHeapID, joProcEntry32, 
  102.                                                         "th32DefaultHeapID"))
  103.         return NULL;
  104.     if (!SetDWORDField(env, lppe->cntThreads, joProcEntry32, "cntThreads"))
  105.         return NULL;
  106.     if (!SetDWORDField(env, lppe->th32ModuleID, joProcEntry32, 
  107.                                                       "th32ModuleID"))
  108.         return NULL;
  109.     if (!SetDWORDField(env, lppe->th32ParentProcessID, joProcEntry32, 
  110.                                                        "th32ParentProcessID"))
  111.         return NULL;
  112.     if (!SetDWORDField(env, lppe->pcPriClassBase, joProcEntry32, 
  113.                                                             "pcPriClassBase"))
  114.         return NULL;
  115.     if (!SetDWORDField(env, lppe->dwFlags, joProcEntry32, "dwFlags"))
  116.         return NULL;
  117.     if (!SetStringField(env, lppe->szExeFile, joProcEntry32, "szExeFile"))
  118.         return NULL;
  119.     return joProcEntry32;
  120. }
  121.  
  122. Listing Five
  123. class ProcessEntry32 extends Object
  124. {
  125.     public int cntUsage;
  126.     public int th32ProcessID;
  127.     public int th32DefaultHeapID;
  128.     public int th32ModuleID;
  129.     public int cntThreads;
  130.     public int th32ParentProcessID;
  131.     public int pcPriClassBase;
  132.     public int dwFlags;
  133.     public String szExeFile;
  134. }
  135.  
  136. Listing Six
  137. BOOL AddObject (JNIEnv *env, jobject vector, jobject ProcEntry32)
  138. {
  139.     if(ProcEntry32 == NULL)
  140.         return FALSE;
  141.     jmethodID jmAddElement = env->GetMethodID(
  142.         env->GetObjectClass(vector),
  143.         "addElement", 
  144.         "(Ljava/lang/Object;)V");
  145.     if(jmAddElement == NULL)
  146.         return FALSE;
  147.     env->CallVoidMethod(vector, jmAddElement, ProcEntry32);
  148.     return TRUE;
  149. }
  150.  
  151. Listing Seven
  152. BOOL SetDWORDField(JNIEnv * env,DWORD field,jobject procEntry32,char *szField)
  153. {
  154.     jfieldID jfield =  env->GetFieldID( 
  155.         env->GetObjectClass(procEntry32),
  156.         szField, 
  157.         "I");
  158.     if ( !IsValidField(jfield, szField) )
  159.         return FALSE;
  160.     env->SetIntField(procEntry32, jfield, field);
  161.     return TRUE;
  162. }
  163.  
  164.  
  165.  
  166.  
  167.